package com.tensquare.ssoserver.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.sql.Struct;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * ------------------------------
 * 功能：
 * 作者：WF
 * 微信：hbxfwf13590332912
 * 创建时间：2021/9/9-15:20
 * ------------------------------
 */
@Controller
@RequestMapping("/sso")
public class SsoServerController {
    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 功能: 在redis中根据token得到用户名
     * 参数:
     * 返回值:
     * 时间: 2021/9/9 15:46
     */
    @GetMapping("/getUsername")
    @ResponseBody       //如果不添加此注解，thymeleaf就当作返回 的是模板引擎的视图页面
    public String getUsername(String token){
        String username = redisTemplate.opsForValue().get(token);
        if(StringUtils.isEmpty(username)){
            return "没有此用户！";
        }
        return username;
    }
    /**
     * 功能: 到达登录界面
     * 参数:
     * 返回值: java.lang.String
     * 时间: 2021/9/9 15:21
     */
    @GetMapping("/login.html")
    public String login(String redirect_uri, Model model, @CookieValue(name = "sso_cookie",required = false) String sso_cookie){
        //1. 如果cookie里面有值，就代表有一个sso客户端曾经登录过
        if(!StringUtils.isEmpty(sso_cookie)){
            return "redirect:" + redirect_uri + "?token="+ sso_cookie;
        }
        model.addAttribute("url",redirect_uri);
        return "login";
    }

    /**
     * 功能: 登录表单处理
     * 参数:
     * 返回值:
     * 时间: 2021/9/9 15:34
     */
    @PostMapping("/doLogin")
    public String doLogin(String username, String password, String url, HttpServletResponse response){
        //1. 生成一个uuid的值
        String uuid = UUID.randomUUID().toString().replace("-","");
        //2. 我们在返回的地址后接一个token的值就是这里的uuid
        if(!StringUtils.isEmpty(url)){
            url += "?token=" + uuid;
            //3. 将以uuid为key，。以username为值，放到redis中,以便于在客户端通过uuid（token的值）得到username
            redisTemplate.opsForValue().set(uuid,username,10, TimeUnit.HOURS);
            //4. 定义一个cookie并放到服务端，代表我们有人登录成功过，下一个进来的人就不用再登录了
            Cookie cookie = new Cookie("sso_cookie",uuid);
            response.addCookie(cookie);
            //5. 返回到原来的页面
            return "redirect:" + url;
        }
        return "login";
    }
}

